<?xml version = '1.0' encoding = 'UTF-8'?>
<HBRRepo><variables><variable name="OQP_BestCasePer" type="num" usage="const" id="1" product="Planning"><property name="application">SalesPln</property><property name="plantype">OEP_QTP</property><property name="prompt_text">Best Case +/- Base Plan Percentage</property><property name="scope">ruleset</property><property name="seeded">true</property><value>5</value><limits type="minmax"><property name="min">-100</property><property name="max">100</property></limits></variable><variable name="OQP_ConservativePer" type="num" usage="const" id="2" product="Planning"><property name="application">SalesPln</property><property name="plantype">OEP_QTP</property><property name="prompt_text">Conservative +/- Base Plan Percentage</property><property name="scope">ruleset</property><property name="seeded">true</property><value>3</value><limits type="minmax"><property name="min">-100</property><property name="max">100</property></limits></variable><variable name="OQP_WorstCasePer" type="num" usage="const" id="3" product="Planning"><property name="application">SalesPln</property><property name="plantype">OEP_QTP</property><property name="prompt_text">Worst Case +/- Base Plan Percentage</property><property name="scope">ruleset</property><property name="seeded">true</property><value>-5</value><limits type="minmax"><property name="min">-100</property><property name="max">100</property></limits></variable></variables><rulesets/><rules><rule id="1" name="OQP_BottomUp What If" product="Planning"><property name="application">SalesPln</property><property name="plantype">OEP_QTP</property><property name="seeded">true</property><variable_references><variable_reference name="OQP_WorstCasePer" id="3"><property name="application">SalesPln</property><property name="hidden">false</property><property name="plantype">OEP_QTP</property><property name="rule_name">OQP_BottomUp What If</property><property name="seq">1</property><property name="type">1</property><property name="useAsOverrideValue">false</property></variable_reference><variable_reference name="OQP_BestCasePer" id="1"><property name="application">SalesPln</property><property name="hidden">false</property><property name="plantype">OEP_QTP</property><property name="rule_name">OQP_BottomUp What If</property><property name="seq">2</property><property name="type">1</property><property name="useAsOverrideValue">false</property></variable_reference><variable_reference name="OQP_ConservativePer" id="2"><property name="application">SalesPln</property><property name="hidden">false</property><property name="plantype">OEP_QTP</property><property name="rule_name">OQP_BottomUp What If</property><property name="seq">3</property><property name="type">1</property><property name="useAsOverrideValue">false</property></variable_reference></variable_references><script type="groovy">			/*RTPS:{OQP_BestCasePer} {OQP_ConservativePer} {OQP_WorstCasePer} */        	
            /*PURPOSE: What if scenarios should be populated based on the percentage input.*/
			List&lt;String> NewColumnDims =[];
			List&lt;String> RowDimensions = [];
            List&lt;String> CustomDimensions=[];
            List&lt;String> CustomDimMembers=[];
            String  ScenarioName; 
            boolean isUnitsModel =false;
            String driverDimMember;
            int iCnt;
			List&lt;String> fixMemberNames = operation.grid.pov*.essbaseMbrName
			List&lt;String> povMembers =[];
			try{
            /*Get driver member*/
            Application app=operation.getApplication();            
			Cube qtp=operation.getCube(); 
			Dimension dim=app.getDimension(DimensionType.ACCOUNT,qtp);
        	if (dim.hasMember("OQP_Units",qtp)==true)
          	{
				isUnitsModel=true;
				driverDimMember="OQP_Last Year Units";
            }
			else
			{
				 isUnitsModel=false;
				 driverDimMember="OQP_Last Year Revenue";                    
			}   
			StringBuilder cscript = new StringBuilder();
			cscript.append('''SET AGGMISSG ON;\n''');
			cscript.append('''SET UPDATECALC OFF;\n''');			
			def grid=operation.grid;
			List&lt;DataGrid.HeaderCell> pov=grid.getPov()
            /* Fetch Row dimensions and their children of the grid*/
			List&lt;DataGrid.Row> rows = grid.getRows()
			for (DataGrid.Row row : rows) 
			{
				List&lt;DataGrid.HeaderCell> subRows = row.getHeaders();
				for(DataGrid.HeaderCell cell : subRows) 
				  {
					  String memName = cell.getEssbaseMbrName();
				   if (!RowDimensions.contains(memName))
				   {
				  	 RowDimensions.add('''"'''+memName +'''"''')
				  
				   }     	 
				 }        
			}
            /*Fetch POV Dimensions and their mebers from POV*/

			for (DataGrid.HeaderCell cell : pov)
			{
			   String mbrName = cell.getEssbaseMbrName();
			   String dimType = cell.getDimensionType();
               String dimName = cell.getDimName();  			   
				if(!dimType.equals("Scenario") &amp;&amp; !dimType.equals("Simple Currency") &amp;&amp; !dimType.equals("Currency"))
				{
                       povMembers.add('''@Relative("'''+mbrName +'''",0)''')					
                       CustomDimensions.add('''"'''+dimName+'''"''');
                       CustomDimMembers.add('''"'''+mbrName+'''"''');
				}    
			}
            
            /*Fetch Column Dimensions*/
            List&lt;List&lt;DataGrid.HeaderCell>> cols = grid.getColumns();
			for (List&lt;DataGrid.HeaderCell> cells : cols) 
			{
			 
				for (DataGrid.HeaderCell cell : cells)  
				  {
				   	String memName = cell.getMbrName();
				   	String dimType = cell.getDimensionType();
						if(dimType.equals("Scenario") &amp;&amp; !dimType.equals("Currency"))
						{
                        	if(!memName.equals("OEP_Actual") &amp;&amp; !memName.equals("OEP_Best Case") &amp;&amp; !memName.equals("OEP_Conservative") &amp;&amp; !memName.equals("OEP_Worst Case"))
                            {
                              ScenarioName=memName;
                            }
						} 	
				  }
						   
			 }
			
			cscript.append('''FIX(@Relative("YearTotal",0),"BegBalance","OEP_Working Bottom Up",&amp;OEP_CurYr''')
			if (app.getCurrencyMode()!=CurrencyMode.SINGLE_CURRENCY)
            {
				String sCurrency =  operation.grid.pov.find { it.dimName == 'Currency' }.essbaseMbrName 
                //cscript.append (''',"'''+app.getDefaultCurrency()+'''"''')
                cscript.append (''',"'''+ sCurrency +'''"''')
            }
			cscript.append(''','''+RowDimensions.join(''',''')+''')\n''')
			cscript.append('''	FIX("OQP_Quota"''')
            if (povMembers.size()>0)
            {
            cscript.append(''','''+povMembers.join(''','''))
            }
			cscript.append(''')\n''')
            /*Data copy from scenario to What if scnearios*/
            cscript.append('''		FIX(@Relative("OQP_Last Year Bookings",0))\n''')
			cscript.append('''			Datacopy "'''+ ScenarioName+'''" to "OEP_Best Case";\n''')
            cscript.append('''			Datacopy "'''+ ScenarioName+'''" to "OEP_Conservative";\n''')
            cscript.append('''			Datacopy "'''+ ScenarioName+'''" to "OEP_Worst Case";\n''')
            cscript.append('''		ENDFIX\n''')
            /*apply Best, Worst and Conservative case percentages*/
			cscript.append('''		"OEP_Worst Case"( \n''')
            cscript.append('''			"OEP_Worst Case"="OEP_Worst Case"+"OEP_Worst Case"*'''+rtps.OQP_WorstCasePer.getDoubleValue()/100+'''; \n''')
            cscript.append('''		) \n''')
            cscript.append('''		"OEP_Best Case"( \n''')
            cscript.append('''			"OEP_Best Case"="OEP_Best Case"+"OEP_Best Case"*'''+rtps.OQP_BestCasePer.getDoubleValue()/100+'''; \n''')
            cscript.append('''		) \n''')
            cscript.append('''		"OEP_Conservative"( \n''')
            cscript.append('''			"OEP_Conservative"="OEP_Conservative"+"OEP_Conservative"*'''+rtps.OQP_ConservativePer.getDoubleValue()/100+'''; \n''')
            cscript.append('''		) \n''')
			cscript.append('''	ENDFIX\n''')
            /*Aggregate what if scenarios*/           
              /*Aggregate Custom Dimensions for first level children of Territory or Resource dimensions*/
            cscript.append('''	FIX("OEP_Worst Case","OEP_Best Case","OEP_Conservative")\n''')	
            
            if (CustomDimensions.size()>1)
             {
             	cscript.append('''		FIX(@Relative("OQP_Last Year Bookings",0),"OQP_Quota")\n''')
                for (iCnt=0;iCnt&lt;CustomDimensions.size()-1;iCnt++)
                {
                cscript.append('''			FIX(@RELATIVE('''+CustomDimensions[iCnt]+''',0))\n''')              
                }                
                for (iCnt=CustomDimensions.size()-1;iCnt>0;iCnt--)
                {
                cscript.append('''				AGG('''+CustomDimensions[iCnt]+''');\n''')                        
                cscript.append('''			ENDFIX\n''')
                }
                cscript.append('''			AGG('''+CustomDimensions[0]+''');\n''')
                cscript.append('''		ENDFIX\n''')
            }
            if (CustomDimensions.size()==1)
            {
            	cscript.append('''		FIX(@Relative("OQP_Last Year Bookings",0),"OQP_Quota")\n''')
             	cscript.append('''	 		AGG('''+CustomDimensions[0]+''');\n''')
                cscript.append('''		ENDFIX\n''')            
            }
            
            
            /*Recalculate Growth percentgates*/
            
			if (CustomDimMembers.size()>0)
			{
            	cscript.append ('''		FIX('''+CustomDimMembers.join(''',''')+''')\n''')					          		  
            }
			
			cscript.append('''			"OQP_Growth%"''')
			cscript.append('''			( \n''')
			cscript.append('''				"OQP_Growth%"  = (("OQP_Quota"->"YearTotal"-"'''+driverDimMember+'''"->"YearTotal")/ "'''+driverDimMember+'''"->"YearTotal");\n''')
			cscript.append('''			) \n''')
            if (CustomDimMembers.size()>0)
			{
            	cscript.append('''		ENDFIX; \n''')
            }
            cscript.append('''	ENDFIX\n''')
            cscript.append('''ENDFIX\n''')

			println (cscript.toString())
			return cscript.toString();
			}catch(all) {
				throw new HspRuntimeException('Error occured while executing business rule');
			}		
		
		</script></rule></rules><components/><deployobjects><deployobject product="2" application="salespln" plantype="oep_qtp" obj_id="1" obj_type="1" name="OQP_BOTTOMUP WHAT IF"/></deployobjects></HBRRepo>